home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 June
/
EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso
/
earcd
/
utilsys
/
rss14gmd.lha
/
RSys_1.4gmd
/
C
/
rsys.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-05
|
23KB
|
992 lines
/*
***************************************************************************
*
* Datei:
* RSys.c
*
* Inhalt:
*
* --- Globale Routinen ---
*
* void About ( void );
* void HandleMainPort ( void );
* void main ( int argc , char **argv );
*
* --- Lokale Routinen ---
*
* static int HandleArguments ( char **str );
* static int position ( int ch );
* static void HandleGadgets ( GADGET *gad );
* static void HandleIDPort ( void );
* static void HandleMenu ( ULONG code );
* static void HandleRawKeys ( ULONG code , ULONG qualifier );
* static void HandleVanillaKeys ( ULONG code , ULONG qualifier );
* static void Jump ( void );
* static void SelectGadget ( GADGET *Gadget );
* static void SetMainLVTop ( int top );
* static void UnSelectGadget ( GADGET *Gadget );
*
* Bemerkungen:
* Hauptprogramm und Handling-Routinen von RSys.
*
* Erstellungsdatum:
* 07-Jan-93 Rolf Böhme
*
* Änderungen:
* 07-Jan-93 Rolf Böhme Erstellung
*
***************************************************************************
*/
#include "RSys.h"
#include "protos.h"
/*#define BETA 1 */
/*
* Der Kennstring, der von dem DOS-Befehl Version
* gefunden wird
*/
char *gmdv = "\0$VER: " NAME " " VERSION " (" DATE " " TIME ") " COPYRIGHT " \n";
/*
* Die Prozedur About() gibt eine Kurzinformation zum
* Programm RSys aus
*/
void
About (void)
{
UBYTE info[] =
"\n»»»»»»»»»»»» " NAME " " VERSION " ««««««««««««\n\n "
" The Program was written by\n\n"
" Rolf Böhme\n"
" Stammestr. 48\n"
" 30459 Hannover 91\n"
" Germany\n"
" Z-NET: R.BOEHME@COPS.ZER\n"
" FIDO: 2:241/37.2 (Rolf Boehme)\n\n"
" It's placed in Public Domain\n"
" under the terms of Giftware!\n"
"Please send small donations, gifts\n"
" or other little sweeties to me!!\n"
" \n"
" Ported to SAS/C by :-\n"
" gduncan@werple.net.au \n";
DPOS;
HandleHelp (MN_About);
MyEasyRequest (SysWnd, (UBYTE *) NAME " Info (" DATE ", " TIME ")",
(UBYTE *) "Continue", info);
return;
}
/*
* Die Prozedur Jump() sucht den nächsten
* PublicScreen in der Systemliste, holt ihn nach
* vorn und öffnet auf ihm das RSys-Hauptfenster
*/
static void
Jump (void)
{
SCREEN *NewScr = NULL;
LIST *PSList = NULL;
NODE *Node = NULL;
char savenamebuffer[MAXPUBSCREENNAME + 1];
int openit;
strcpy (savenamebuffer, (char *) namebuffer);
/*
* Sperren der Systemliste aller PubScreens
*/
PSList = LockPubScreenList ();
/*
* Aktuellen Knoten finden, also den Screen auf dem sich
* RSys im Moment befindet
*/
Forbid ();
Node = FindName (PSList, namebuffer);
Permit ();
if (NOT (Node))
{
UnlockPubScreenList ();
ErrorHandle ((char *) namebuffer, SCREEN_ERR, FIND_FAIL, NO_KILL);
}
else
{
while (Node)
{
/*
* Falls der gefundene PubScreen der letzte im System ist,
* wird dieser gelocked
*/
if (NOT (Node->ln_Succ))
{
Node = PSList->lh_Head;
strcpy ((char *) namebuffer, Node->ln_Name);
NewScr = LockPubScreen (namebuffer);
break;
}
else if (NewScr = LockPubScreen ((UBYTE *) Node->ln_Succ->ln_Name))
{
strcpy ((char *) namebuffer, Node->ln_Succ->ln_Name);
break;
}
/*
* Falls der Nachfolger-PubScreen nicht gesperrt werden konnte,
* wird der nächste gesucht.
*/
Node = Node->ln_Succ;
}
UnlockPubScreen (NULL, NewScr);
UnlockPubScreenList ();
if (NewScr != lastpubscreen)
{
ScreenToFront (NewScr);
CloseASysWindow (&SysWnd, &SysGList, &SysMenus);
CloseDownScreen ();
OpenMainWindow ();
RefreshList (LastID);
openit = CloseHelpOnScreen ();
OpenHelpOnScreen (openit);
ClearIntuiMsgPort (SysWnd);
}
else
{
strcpy ((char *) namebuffer, savenamebuffer);
ErrorHandle ("No more Public Screens", SCREEN_ERR, FIND_FAIL, NO_KILL);
}
}
return;
}
/*
* Die Funktion position() gibt für die
* Gadget-Tastatturabfrage die Position des Zeichens
* ch in der Zeichenkette itemcode[] zurück
*/
static int
position (int ch)
{
char *itemcode = "TLMPVAFRIWSHYD J";
/*
* Die Position des Zeichens errechnet sich aus der
* Differenz der Zeiger auf das gefundene Zeichen und
* dem auf die Zeichenkette itemcode
*/
int pos = (int) (strchr (itemcode, (int) ToUpper ((ULONG) ch)) - itemcode);
return ((pos < 0) ? ~0 : pos);
}
/*
* In diesem Feld stehen nach dem Aufruf die
* erwarteten Parameter. Im Falle der verwendeten
* Schalter steht im entsprechenden Feld opts[i] ein
* TRUE oder FALSE, jenachdem, ob der Schalter beim
* Aufruf angegeben wurde oder nicht
*/
LONG opts[COUNT_FLAGS];
/*
* Diese Funktion parst die Kommandozeile und gibt
* die Nummer des entsprechenden Schalters zurück.
* Defaultmäßig wird 12 (Systeminfo) zurückgegeben
*/
static int
HandleArguments (char **str)
{
int ret = 12, j;
RDARGS *argsptr;
/*
* Die Kommandozeile wird geparst. Falls ein Fehler
* beim Parsen auftrat, wird das Programm mit einer
* Fehlermeldung verlassen
*/
if ((argsptr = ReadArgs (TEMPLATE, opts, NULL)) == NULL)
{
ErrorHandle ("TemplateError", TASK_ERR, WRONG_FAIL, KILL);
}
else
{
/*
* Das Feld opts[] wird durchsucht, ob ein Flag
* gesetzt wurde. Falls eine gesetzte Option gefunden
* wurde, wird die Schleife abgebrochen und der
* entsprechende Rückgabewert gesetzt
*/
for (j = 0; j < COUNT_FLAGS; j++)
if (opts[j])
{
ret = j;
break;
}
/*
* Die Funktion ReadArgs() reserviert intern
* Speicherplatz für die Kommandoargumente. Dieser
* Platz muß dem System mit der Prozedur FreeArgs()
* zurückgegeben werden
*/
FreeArgs (argsptr);
}
return (ret);
}
/*
* Die Prozedur HandleIDPort() wird aufgerufen, wenn RSys
* ein zweites Mal gestartet wird. Wird dabei ein Parameter
* übergeben, so wird dieser mit dem Message-System des
* AmigaDOS an den ID-Port des bereitsgestarteten Programms
* versendet und hier ausgewertet. Die Struktur RSYS_SysMsg
* enthält neben der Standard-System-Message noch die ID
* der anzuzeigenden Liste.
*/
static void
HandleIDPort (void)
{
RSYS_SysMsg *arrived_mess;
int ID;
/*
* Es werden alle Nachrichten ausgewertet, solange, bis
* die Message-Queue leer ist.
*/
while (arrived_mess = (RSYS_SysMsg *) GetMsg (SysIdPort))
{
ID = arrived_mess->sm_newtype;
ReplyMsg ((MESSAGE *) arrived_mess);
/*
* Falls das RSys-Hauptfenster mit dem Zip-Gadget auf
* eine kleine Fenstergröße gebracht wurde, wird es
* jetzt nach vorne geholt und auf normale Größe
* gebracht.
*/
if (SysWnd->Flags & WFLG_ZOOMED)
{
WindowToFront (SysWnd);
ZipWindow (SysWnd);
}
/*
* In jedem Fall wird das RSys-Hauptfenster aktiviert.
*/
ActivateWindow (SysWnd);
/*
* Ist die erhaltene Nachricht von einem zweiten
* RSys-Aufruf ohne Parameter abgesendet worden, steht
* das ID-Feld der RSYS_SysMsg-Struktur auf SYSTEMINFO.
* Falls ein Parameter angegeben wurde, wird die
* Anzeigeliste mit dem neuen Parameter aktualisiert
* und in der globalen Variablen LastID gemerkt.
*/
if (ID != SYSTEMINFO)
RefreshList (LastID = ID);
/*
* Während der ID-Port abgefragt wird, kann das
* Hauptfenster Nachrichten empfangen haben. Diese
* sollen nach dem Empfang der Nachricht vom zweiten
* Programmaufruf nicht ausgewertet werden. Deshalb
* werden jetzt die evtl. vorhandenen Nachrichten des
* Hauptfenster-Ports gelöscht.
*/
ClearIntuiMsgPort (SysWnd);
}
return;
}
void
SetMainLVTop (int top)
{
GT_SetGadgetAttrs (SysGadgets[GD_ListeLV], SysWnd,
NULL,
GTLV_Top, top,
TAG_DONE);
return;
}
/*
* Die Procedure HandleRawKeys() wertet die
* Tastatureingaben des Hauptfensters aus. Dazu wird
* das Feld IntuiMessage->Code verwendet.
*/
static void
HandleRawKeys (ULONG code, ULONG qualifier)
{
/*
* Es werden bei einem Tastatur-Event zwei Messages
* an den Hauptfenster-Port versendet, wenn die Taste
* gedrückt und dann, wenn sie losgelassen wurde.
* Hier sollen nur die Events ausgewertet werden, die
* direkt nach dem Drücken einer Taste anliegen.
*/
if (code & IECODE_UP_PREFIX)
return;
if (qualifier & CTRLKEYS)
return;
switch (code)
{
/*
* Falls die "Cursor-Down"-Taste gedrückt wurde, wird
* der oberste Eintrag des ListViews aktualisiert und
* auf den nächsten Eintrag gesetzt, falls es nicht
* schon der letzte oberste Eintrag war. Der globale
* Zähler topentry wird dann um eins erhöht.
*/
case CURSORDOWN:
if (topentry < (countentries - newlvh))
{
topentry++;
SetMainLVTop (topentry);
actualfindnode = GetNode (&ListeLVList, topentry);
actualfindnodenum = topentry;
}
break;
/*
* Falls die "Cursor-Up"-Taste gedrückt wurde, wird
* der oberste Eintrag des ListViews aktualisiert und
* auf den vorherigen Eintrag gesetzt, falls es nicht
* schon der erste Eintrag der Liste war. Der globale
* Zähler topentry wird dann um eins erniedrigt.
*/
case CURSORUP:
if (topentry > 0)
{
topentry--;
SetMainLVTop (topentry);
actualfindnode = GetNode (&ListeLVList, topentry);
actualfindnodenum = topentry;
}
break;
/*
* Das ListView zeigt den Anfang der Liste. Der
* Zähler topentry wird auf Null gesetzt.
*/
case CURSORLEFT:
if (topentry != 0)
{
topentry = 0;
SetMainLVTop (topentry);
actualfindnode = GetNode (&ListeLVList, topentry);
actualfindnodenum = topentry;
}
break;
/*
* Das ListView zeigt das Ende der Liste. Der
* Zähler topentry wird auf den Eintrag mit der
* Nummer (Anzahl der Einträge - Anzahl der
* sichtbaren Einträge) gesetzt.
*/
case CURSORRIGHT:
if (topentry != (countentries - newlvh))
{
topentry = (countentries - newlvh);
SetMainLVTop (topentry);
actualfindnode = GetNode (&ListeLVList, topentry);
actualfindnodenum = topentry;
}
break;
default:
/* PrintStatistics(); */
break;
}
return;
}
/*
* Die Funktion SelectGadget() simuliert den
* Gadget-Down-Klick eines Boolean-Gadgets.
*/
static void
SelectGadget (GADGET * Gadget)
{
UWORD oldpos;
/*
* Dazu wird das Gadget aus der Gadget-Liste
* entfernt, das SELECTED-Flag gesetzt und das Gadget
* wieder an der gleichen Position in die Liste
* eingehängt.
*/
oldpos = RemoveGadget (SysWnd, Gadget);
Gadget->Flags |= GFLG_SELECTED;
AddGadget (SysWnd, Gadget, (ULONG) oldpos);
/*
* Nun wird das Gadget wieder aktualisiert und ein
* wenig gewartet.
*/
RefreshGList (Gadget, SysWnd, NULL, 1);
return;
}
/*
* Die Funktion UnSelectGadget() simuliert den
* Gadget-Up-Klick eines Boolean-Gadgets.
*/
static void
UnSelectGadget (GADGET * Gadget)
{
UWORD oldpos;
/*
* Dazu wird das Gadget aus der Gadget-Liste
* entfernt, das SELECTED-Flag entfernt und das
* Gadget wieder an der gleichen Position in die
* Liste eingehängt.
*/
oldpos = RemoveGadget (SysWnd, Gadget);
Gadget->Flags &= ~GFLG_SELECTED;
AddGadget (SysWnd, Gadget, (ULONG) oldpos);
/*
* Nun wird das Gadget wieder aktualisiert.
*/
RefreshGList (Gadget, SysWnd, NULL, 1);
return;
}
/*
* Die Procedure HandleVanillaKeys() wertet die
* Tastatureingaben des Hauptfensters aus. Dazu wird
* das Feld IntuiMessage->Code verwendet.
*/
static void
HandleVanillaKeys (ULONG code, ULONG qualifier)
{
int ID;
if (qualifier & CTRLKEYS)
return;
/*
* Wurde die Esc-Taste gedrückt, werden zwei Fälle
* unterschieden. Wurde RSys von der WB gestartet,
* geht RSys in den AppIcon-Modus, wurde es von einem
* CLI gestartet, wird RSys beendet, indem das globale
* Flag Flags.quit_flag gesetzt wird.
*/
if ((char) code == ESC && !Flags.wb_start)
{
Flags.quit_flag = 1;
return;
}
/*
* Wurde RSys mit dem Zip-Gadget verkleinert, werden
* keine Vanillakeys ausgewertet.
*/
if (SysWnd->Flags & WFLG_ZOOMED)
return;
if ((char) ToUpper (code) == 'N')
{
SelectGadget (SysGadgets[GD_NewGad]);
RefreshList (LastID);
UnSelectGadget (SysGadgets[GD_NewGad]);
return;
}
/*
* Nun wird die Listen-ID aus dem Code des Gadgets
* ermittelt, dessen entsprechende Taste gedrückt
* wurde.
*/
ID = position ((int) code);
/*
* Entspricht die ID einer Gadget-ID, wird das
* entsprechende Gadget aktiviert und die
* entsprechende Aktion ausgeführt. Dabei wird die
* ID des aktuellen ListView-Inhalts in LastID
* gemerkt.
*/
if ((ID < GD_SaveListGad) && (ID != ~0))
{
HandleHelp ((enum RSysNumbers) ID);
LastID = ID;
SelectGadget (SysGadgets[LastID]);
RefreshList (ID);
UnSelectGadget (SysGadgets[LastID]);
return;
}
/*
* Wurde das Jump-Gadget aktiviert, schließt RSys sein
* Hauptfenster und öffnet es auf dem vordersten
* PublicScreen.
*/
if (ID == GD_JumpGad)
{
Jump ();
return;
}
/*
* Kommt das Programm bis hierhin, konnte der
* Tastenklick nicht erkannt werden. Es erfolgt eine
* entsprechende Nachricht im Message-Feld von RSys.
*/
PrintStatistics ();
return;
}
/*
* Die Prozedur HandleGadgets() verarbeitet die
* Gadgetevents. Zu einem Parameter gad wird die
* entsprechende Aktion ausgelöst.
*/
static void
HandleGadgets (GADGET * gad)
{
char fileout[MAXFULLNAME];
int ID = (int) gad->GadgetID;
HandleHelp ((enum RSysNumbers) ID);
if (ID == GD_NewGad)
{
RefreshList (LastID);
return;
}
/*
* Falls die ListView-Liste abgespeichert werden
* soll, wird ein Asl-Requester angeboten und die
* Liste in eine ausgewählte Datei als Textdatei
* weggeschrieben.
*/
if (ID == GD_SaveListGad)
{
sprintf (fileout, "RSys-%s.dat", EntryAttr[LastID].ea_type);
if (GetFile (SysWnd, "RAM:", fileout, "#?.dat", "Select File for saving list", "Save"))
SaveList (SysWnd, (char *) _fullpath, EntryAttr[LastID].ea_type, &ListeLVList, TRUE);
return;
}
/*
* Handelt es sich um die anderen Gadgets, wird
* entsprechend der GadgetID das ListView
* aktualisiert.
*/
if (ID < GD_SaveListGad)
{
LastID = ID;
RefreshList (ID);
return;
}
/*
* Wurde das Jump-Gadget aktiviert, schließt RSys sein
* Hauptfenster und öffnet es auf dem vordersten
* PublicScreen.
*/
if (ID == GD_JumpGad)
Jump ();
return;
}
/*
* Die Prozedur HandleMenu() verwaltet die
* Menu-Eingaben.
*/
static void
HandleMenu (ULONG code)
{
MENUITEM *item;
USHORT nextcode = (USHORT) code;
void (*fptr) (void);
ReopenWindow = FALSE;
DPOS;
/*
* Falls ein Menüpunkt ausgewählt wurde, wird das
* entsprechende Menü-Item ermittelt. Aus dem
* UserData-Feld dieses Menüpunktes erhält man
* schließlich einen Zeiger auf die Funktion, die
* ausgeführt werden soll.
* Erweiterung: Werden mehrere Menüpunkte hintereinander
* angewählt, ohne das Menü zu desaktivieren, werden
* auch alle ausgewählt.
*/
while (nextcode != MENUNULL && !ReopenWindow)
{
if ((item = ItemAddress (SysMenus, (long) nextcode)) != NULL)
{
/*
* Falls das UserData-Feld initialisiert wurde, wird
* der dort eingetragene Zeiger als Zeiger auf eine
* auszuführende Funktion genommen und ausgeführt.
*/
if (fptr = (void (*)()) GTMENUITEM_USERDATA (item))
(*fptr) ();
}
else
break;
nextcode = item->NextSelect;
}
return;
}
/*
* HandleMainPort() bearbeitet die Nachrichten vom RSys-
* Hauptfenster und ruft die entsprechenden Unter-
* programme auf
*/
void
HandleMainPort (void)
{
INTUIMESSAGE *message;
ULONG class, code, qualifier;
APTR object;
static int refr = TRUE;
int GID;
static int oldh;
while ((message = (INTUIMESSAGE *) GT_GetIMsg (SysWnd->UserPort)) != NULL)
{
/*
* Die wichtigsten Daten werden aus der erhaltenen
* Nachricht kopiert.
*/
object = message->IAddress;
class = message->Class;
code = message->Code;
qualifier = message->Qualifier;
/*
* Die Nachricht wird sofort beantwortet, damit
* Intuition nicht länger als notwendig auf eine
* Antwort wartet.
*/
GT_ReplyIMsg (message);
if (!Flags.helpmode && ICONIFY_REQUESTED)
{
Iconify ();
ClearIntuiMsgPort (SysWnd);
return;
}
/*
* Entsprechend der Art (der Klasse) der Nachricht
* werden die Aktionen ausgeführt.
*/
switch (class)
{
/*
* Ist die Volumes-Liste im ListView aktiv und wurde
* ein Diskettenwechsel in den Laufwerken erkannt,
* wird die Liste automatisch aktualisiert.
*/
case IDCMP_DISKINSERTED:
case IDCMP_DISKREMOVED:
if (LastID == VOLUMES)
RefreshList (LastID);
break;
/*
* Wurde eine Taste gedrückt, wird eine entsprechende
* Aktion gestartet. Falls ein Qualifier (also einer
* der Shift-, Amiga- und Control-Tasten oder eine
* Kombination von diesen) erkannt wurde, wird keine
* Aktion gestartet.
*/
case IDCMP_VANILLAKEY:
HandleVanillaKeys (code, qualifier);
break;
/*
* Wurde eine Taste oder Sondertaste gedrückt, wird
* eine entsprechende Aktion gestartet. Falls ein
* Qualifier (also einer der Shift-, Amiga- und
* Control-Tasten oder eine Kombination von diesen)
* erkannt wurde, wird keine Aktion gestartet.
*/
case RAWKEY:
HandleRawKeys (code, qualifier);
break;
/*
* Wird ein Gadget auf dem Hauptfenster angeklickt,
* wird eine entsprechende Aktion gestartet. Wurde
* das ListView angeklickt, wird versucht, den
* Eintrag zu modifizieren.
*/
case IDCMP_GADGETUP:
GID = ((GADGET *) object)->GadgetID;
if (GID == GD_ListeLV)
{
HandleHelp ((enum RSysNumbers) GID);
ModifyObject (LastID, code);
}
else
HandleGadgets ((GADGET *) object);
break;
/*
* Wird das Hauptfenster gezipt, wird der Inhalt des
* Fensters und das Hintergrundmuster erneuert.
*/
case IDCMP_CHANGEWINDOW:
if (NOT (SysWnd->Flags & WFLG_ZOOMED))
{
/*
* Das Fenster soll nur EINMAL refreshed werden.
* Diese IDCMP-Message kommt aber auch dann, wenn ein
* Fenster verschoben wurde, weshalb ein Flag extra
* eingeführt wurde.
*/
if (NOT (refr))
{
RefreshMainWindowPattern ();
refr = TRUE;
if (Flags.autofront)
{
WindowToFront (SysWnd);
ActivateWindow (SysWnd);
}
}
}
else
refr = FALSE;
break;
case IDCMP_SIZEVERIFY:
oldh = SysWnd->Height;
break;
case IDCMP_NEWSIZE:
if ((SysWnd->Height - oldh) != 0)
ResizeWindowRefresh ();
break;
/*
* Ein Menüpunkt wurde ausgewählt.
*/
case MENUPICK:
HandleMenu (code);
break;
/*
* Das Closegadget des Hauptfensters wurde geklickt.
* Nach einer Sicherheitsabfrage wird das Programm
* beendet.
*/
case IDCMP_CLOSEWINDOW:
quit (TRUE);
break;
default:
break;
}
}
return;
}
/*
* Das Hauptprogramm. Hier werden alle
* Intuition-Events abgeholt und die entsprechenden
* Auswerteprozeduren aufgerufen.
*/
void
main (int argc, char **argv)
{
ULONG mask;
DPOS;
/*
* Das Flag, daß die Beendung des Programms
* signalisiert wird initialisiert.
*/
Flags.quit_flag = 0;
InstallTrapHandlers ();
/*
* Falls RSys vom CLI aus gestartet wurde, erscheint
* eine kleine Infozeile im CLI. Dann wird die
* globale Variable Flags.wb_start auf FALSE gesetzt, da
* das Programm in diesem Fall nicht von der WB aus
* gestartet wurde.
*/
if (argc)
{
/*
GMD
PutStr ((UBYTE *) & gmdv[7]);
*/
Flags.wb_start = 0;
}
else
Flags.wb_start = 1;
/*
* Falls bei einem CLI-Aufruf Parameter mit angegeben
* wurden, werden diese ausgewertet.
*/
if (argc >= 2)
LastID = HandleArguments (argv);
/*
* Es wird festgestellt, ob das Programm bereits
* gestartet wurde. Wurde es bereits gestartet, wird
* das Programm beendet. Dabei werden die evtl.
* angegebenen und verarbeiteten Parameter an das
* bereits laufende Programm verschickt.
*/
if (SysStarted (LastID))
CloseAll ();
/*
* Alle notwendigen Ressourcen (Libraries, RSys-Ports
* etc.) werden eröffnet und bereitgestellt.
*/
OpenLibs ();
/*
* Der ID-Port wird erzeugt. An der Existenz dieses
* Ports kann bei einem zweiten Aufruf des Programms
* festgestellt werden, ob RSys bereits gestartet
* wurde.
*/
if (!(SysIdPort = CreatePort (ID_PORT_NAME, 0)))
ErrorHandle ((char *) ID_PORT_NAME, PORT_ERR, CREATE_FAIL, KILL);
/*
* Das ListView wird initialisiert.
*/
NewList (&ListeLVList);
/*
* Falls der Aufruf von der WB aus geschah, wird RSys
* "iconifiziert", d.h. ein AppIcon wird auf der
* WB erzeugt. Andernfalls wird das Hauptfenster
* geöffnet und entsprechend der Nummer LastID das
* ListView aktualisiert.
*/
if (Flags.wb_start)
Iconify ();
else
{
OpenMainWindow ();
RefreshList (LastID);
}
/*
* Schleifenbeginn. Solange, bis ein
* Abbruchkriterium erkannt wurde (Flags.quit_flag ist
* TRUE), wird auf das Setzen der entsprechenden
* Flags gewartet.
*/
do
{
/*
* Warten auf folgende Events:
* - ^C wurde eingegeben
* - Events vom Hauptfenster
* - Events vom ID-Port
* - Events vom Broker-Port.
*/
mask = Wait (SIGBREAKF_CTRL_C |
(1L << SysWnd->UserPort->mp_SigBit) |
(1L << SysIdPort->mp_SigBit) |
(1L << broker_mp->mp_SigBit));
/*
* Falls ein ^C eingegeben wurde, wird das
* Programmbeendigungsflag gesetzt.
*/
if (CTRL_C_RECEIVED)
Flags.quit_flag = 1;
/*
* Wenn das Programm ein zweitesmal aufgerufen wird,
* erhält der ID-Port eine Nachricht.
*/
if (ID_PORT_SIG_RECEIVED)
HandleIDPort ();
/*
* Falls von dem System-Programm Exchange ein Signal
* gesendet wurde, wird es hier verarbeitet.
*/
if (BROKER_PORT_SIG_RECEIVED)
HandleBrokerPort ();
/*
* Falls das Hauptfenster ein Signal erhalten hat,
* werden die Daten der Nachricht(en) gemerkt und
* weiterverarbeitet.
*/
if (WINDOW_PORT_SIG_RECEIVED)
HandleMainPort ();
}
/*
* Das Programm läuft solange, bis das Flags.quit_flag
* gesetzt wurde.
*/
while (NOT ((Flags.quit_flag)));
/*
* Die geöffneten Resourcen werden geschlossen und
* das Programm beendet.
*/
CloseAll ();
return;
}